package api

import (
	"bytes"
	"io/ioutil"
	"net/http"

	"rt.com/mocktool/utils/glog"
)

// ErrorMsg 错误信息
type ErrorMsg struct {
	Msg  string `json:"msg"`
	Code int    `json:"code"`
}

// RegisterAPI 注册API表
func RegisterAPI(mux *http.ServeMux) {
	mux.HandleFunc("/func/loadSetupInfo", loadSetupInfo)       // 获取服务配置信息
	mux.HandleFunc("/func/setServerPort", setServerPort)       // 切换服务器端口号
	mux.HandleFunc("/func/updateMethod", updateMethod)         // 更新Mock方法
	mux.HandleFunc("/func/loadMethods", loadMethods)           // 读取Mock方法列表
	mux.HandleFunc("/func/loadMethodDetail", loadMethodDetail) // 读取Mock方法详情
	mux.HandleFunc("/func/deleteMethods", deleteMethods)       // 删除选中的Mock方法
	mux.HandleFunc("/func/copyMethods", copyMethods)           // 复制选中的Mock方法
}

// DebugAPI 为输入接口打印日志
func DebugAPI(w http.ResponseWriter, r *http.Request) {
	debugAPI(w, r)
}

// debugAPI 为输入接口打印日志
func debugAPI(w http.ResponseWriter, r *http.Request) {
	// 基本信息
	glog.Debug("================ APIRequest-S ================")
	glog.Debug(r.Proto, " ", r.Method, " ", r.Host, " ", r.URL)
	// 地址参数
	urlParams := r.URL.Query()
	if len(urlParams) > 0 {
		glog.Debug("------URL PARAM------")
		for i := range urlParams {
			glog.Debug(i, "=", urlParams.Get(i))
		}
	}
	// Cookies
	cookies := r.Cookies()
	if len(cookies) > 0 {
		glog.Debug("------Cookies------")
		for _, c := range cookies {
			glog.Debug(c.Name + " " + c.Value)
		}
	}
	// 表单
	if r.Method != "GET" {
		// 表单内容
		glog.Debug("------BODY------")
		body, err := ioutil.ReadAll(r.Body)
		if err != nil {
			glog.Debug(err.Error())
		}
		glog.Debug(string(body))
		// 恢复表单数据流（读过的流得回传）
		r.Body.Close()
		r.Body = ioutil.NopCloser(bytes.NewBuffer(body))
		// 表单参数
		r.ParseForm()
		if len(r.PostForm) > 0 {
			glog.Debug("------FORM PARAM------")
			for i := range r.PostForm {
				glog.Debug(i, "=", r.PostForm.Get(i))
			}
		}
		// 恢复表单数据流（读过的流得回传）
		r.Body.Close()
		r.Body = ioutil.NopCloser(bytes.NewBuffer(body))
	}
	glog.Debug("================ APIRequest-E ================")
}
